/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package wasolicitudesfiec.logicacontrol.SolicitarAperturaTopico;

import entidad.Usuario;
import entidad.apertura.Solicitudaperturatopico;
import hero.interfaces.BnNodeValue;
import java.sql.Date;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.faces.context.FacesContext;
import wasolicitudesfiec.AperturaTopico.SolicitarInforme;
import wasolicitudesfiec.authentication.AuthenticationPhaseListener;
import wasolicitudesfiec.general.MensajeException;
import wasolicitudesfiec.logicacontrol.CTRL_Base;
import web.util.Constantes;

/**
 *
 * @author kabad
 */
public class CTRL_SolicitarInforme extends CTRL_Base {

    private SolicitarInforme gui;
    private final String nombreProceso = Constantes.Modelo.modelo_SolicitarAperturaTopico;
    private final String nombreActividad = Constantes.SolicitarAperturaTopico.solicitarInforme;

    public CTRL_SolicitarInforme(SolicitarInforme gui, FacesContext facesContext) {
        super(facesContext);
        this.gui = gui;
        String instancia;
        instancia = (String) externalContext.getRequestParameterMap().get("instancia");
        if (instancia != null) {
            externalContext.getSessionMap().put("instancia", instancia);
        }
    }

    public String getNombreInstanciaProceso() {
        String instancia;
        instancia = (String) externalContext.getSessionMap().get("instancia");
        return instancia;
    }

    public void inicializar() throws MensajeException {
        gui.getMenu().setTitulo(this.nombreProceso + " -> " + nombreActividad);
        String nombreInstancia;
        Solicitudaperturatopico solicitud;
        try {
            nombreInstancia = getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstancia);
            int idSolicitud = Integer.parseInt((String) prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitud = logica.getLogAperturaTopico().leerSolicitudAperturaNivel2(idSolicitud);
            gui.getDetalleSolicitarApertura().getLblSolicitante().setText(solicitud.getProfesor().getPersona().toString());
            gui.getDetalleSolicitarApertura().getTxtaTema().setValue(solicitud.getTemaTopico());
            if (solicitud.getObservacionProfesor() != null) {
                gui.getDetalleSolicitarApertura().getTxtaComentarios().setValue(solicitud.getObservacionProfesor());
            } else {
                gui.getDetalleSolicitarApertura().getTxtaComentarios().setValue(Constantes.Mensajes.noComentarios);
            }
            if (solicitud.getPathArchivoAdjunto() != null) {
                gui.getDetalleSolicitarApertura().getLinkArchivo().setRendered(true);
                gui.getDetalleSolicitarApertura().getStNoArchivo().setRendered(false);
                gui.getDetalleSolicitarApertura().getLinkArchivo().setUrl(Constantes.Rutas.rutaArchivos + solicitud.getPathArchivoAdjunto().replaceAll(" ", "%20"));
                gui.getDetalleSolicitarApertura().getLinkArchivo().setText(solicitud.getNombreArchivo());
            } else {
                gui.getDetalleSolicitarApertura().getLinkArchivo().setRendered(false);
                gui.getDetalleSolicitarApertura().getStNoArchivo().setRendered(true);
                gui.getDetalleSolicitarApertura().getLinkArchivo().setText(Constantes.Mensajes.noarchivos);
            }
        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception exception) {
            Logger.getLogger(CTRL_SolicitarInforme.class.getName()).log(Level.SEVERE, null, exception);
            throw new MensajeException(Constantes.Mensajes.noInicia);
        }
    }

    public void solicitarInforme() throws MensajeException {
        String nombreInstancia;
        BnNodeValue actividad;
        Solicitudaperturatopico solicitud;
        Usuario usuarioConectado;
        usuarioConectado = (Usuario) externalContext.getSessionMap().get(AuthenticationPhaseListener.USER_SESSION_KEY);

        try {
            if ((gui.getHfUsuarioEvaluador1().getText() == null) &&
                    (gui.getHfUsuarioEvaluador2().getText() == null) && (gui.getHfUsuarioEvaluador3().getText() == null)) {
                throw new MensajeException("Debe seleccionar por lo menos un evaluador para la solicitud.");
            }
            nombreInstancia = getNombreInstanciaProceso();
            this.inicializarInstancia(nombreInstancia);
            actividad = usrSession.getNode(nombreInstancia, nombreActividad);
            if (!(actividad != null &&
                    (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                    actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                throw new Exception();
            }
            int idSolicitud = Integer.parseInt((String) prjSession.getProperty(Constantes.Atributo.idSolicitudProceso).getTheValue());
            solicitud = logica.getLogAperturaTopico().leerSolicitudApertura(idSolicitud);
            
            if (gui.getHfUsuarioEvaluador1().getText() != null) {
                 int idEvaluador = Integer.parseInt((String)gui.getHfUsuarioEvaluador1().getText());         
                solicitud.setFkIdEvaluador1(idEvaluador);
                prjSession.setProperty(Constantes.Atributo.evaluador1, logica.leerPersona(idEvaluador).getUsuario());
            } else {
                prjSession.setProperty(Constantes.Atributo.evaluador1, "comodin");
            }
            if (gui.getHfUsuarioEvaluador2().getText() != null) {
                  int idEvaluador = Integer.parseInt((String)gui.getHfUsuarioEvaluador2().getText());                     
                solicitud.setFkIdEvaluador2(idEvaluador);
                prjSession.setProperty(Constantes.Atributo.evaluador2, logica.leerPersona(idEvaluador).getUsuario());
            } else {
                prjSession.setProperty(Constantes.Atributo.evaluador2, "comodin");
            }
            if (gui.getHfUsuarioEvaluador3().getText() != null) {
                 int idEvaluador = Integer.parseInt((String)gui.getHfUsuarioEvaluador3().getText());    
                solicitud.setFkIdEvaluador3(idEvaluador);
                prjSession.setProperty(Constantes.Atributo.evaluador3, logica.leerPersona(idEvaluador).getUsuario());
            } else {
                prjSession.setProperty( Constantes.Atributo.evaluador3, "comodin");
            }
             solicitud = logica.getLogAperturaTopico().guardarYClonarSolicitudApertura(solicitud);
            prjSession.setNodeProperty(nombreActividad, Constantes.Atributo.idSolicitudActividad, solicitud.getIdSolicitudApertura() + "");
            usrSession.startActivity(nombreInstancia, nombreActividad);
            usrSession.terminateActivity(nombreInstancia, nombreActividad);

            //hacemos las actividades de informe
            logica.autenticaComodin();
            if (gui.getHfUsuarioEvaluador1().getText() == null) {
                String nombreActividadInforme = Constantes.SolicitarAperturaTopico.emitirInformeEvaluador1;
                actividad = usrSession.getNode(nombreInstancia, nombreActividadInforme);
                if (!(actividad != null &&
                        (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                        actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                    throw new Exception();
                }
                usrSession.startActivity(nombreInstancia, nombreActividadInforme);
                usrSession.terminateActivity(nombreInstancia, nombreActividadInforme);
            }
            if (gui.getHfUsuarioEvaluador2().getText() == null) {
                String nombreActividadInforme = Constantes.SolicitarAperturaTopico.emitirInformeEvaluador2;
                actividad = usrSession.getNode(nombreInstancia, nombreActividadInforme);
                if (!(actividad != null &&
                        (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                        actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                    throw new Exception();
                }
                usrSession.startActivity(nombreInstancia, nombreActividadInforme);
                usrSession.terminateActivity(nombreInstancia, nombreActividadInforme);

            }
            if (gui.getHfUsuarioEvaluador3().getText() == null) {
                String nombreActividadInforme = Constantes.SolicitarAperturaTopico.emitirInformeEvaluador3;
                actividad = usrSession.getNode(nombreInstancia, nombreActividadInforme);
                if (!(actividad != null &&
                        (actividad.getState() == hero.interfaces.Constants.Nd.READY ||
                        actividad.getState() == hero.interfaces.Constants.Nd.ANTICIPABLE))) {
                    throw new Exception();
                }
                usrSession.startActivity(nombreInstancia,nombreActividadInforme);
                usrSession.terminateActivity(nombreInstancia, nombreActividadInforme);

            }
           
            logica.autentica(usuarioConectado.getUsuario(), usuarioConectado.getPassword());
        } catch (MensajeException ex) {
            throw ex;
        } catch (Exception ex) {
            Logger.getLogger(CTRL_SolicitarInforme.class.getName()).log(Level.SEVERE, null, ex);
            throw new MensajeException(Constantes.Mensajes.noGuarda);
        }
    }
}
